package services.impl;

import java.util.List;
import java.util.Vector;
import java.util.logging.Level;
import java.util.logging.Logger;

import javax.ejb.EJB;
import javax.ejb.Stateless;

import services.ListaPreciosService;
import services.ProveedorService;
import dao.ProveedorDAO;
import entities.CondicionCompra;
import entities.ListaPrecios;
import entities.Proveedor;
import entities.VO.CondicionCompraVO;
import entities.VO.ProveedorVO;
import finals.Finals;
@Stateless
public class ProveedorServiceBean implements ProveedorService{
	
	private Logger logger = Logger.getLogger(Finals.LOGPATH);
	@EJB
	private ProveedorDAO proveedorDAO;
	
	@EJB
	private ListaPreciosService listaPreciosService;
	
	@Override
	public void delete(Object id) {
		proveedorDAO.delete(id);
	}	

	@Override
	public List<Proveedor> findAll() {
		return proveedorDAO.findAll();
	}
	
	/**
	 * Obtiene todos los proveedores en formato VO
	 */
	public List<ProveedorVO> findAllVO() {
		List<ProveedorVO> proveedoresVO = new Vector<ProveedorVO>();
		for (Proveedor proveedor : proveedorDAO.findAll()) {
			proveedoresVO.add(proveedor.getVO());			
		}
		return proveedoresVO;
	}

	@Override
	public Proveedor findByID(Object id) {
		return proveedorDAO.findByID(id);
	}
	

	public ProveedorVO findByIDVO(Object id){
		Proveedor proveedor = findByID(id);
		return proveedor.getVO();
	}

	@Override
	public void persist(Proveedor entity) {
		proveedorDAO.persist(entity);
	}	
	
	public void altaProveedor(ProveedorVO ProveedorVO) {
		try{
			Proveedor proveedor = new Proveedor();
			proveedor.setVO(ProveedorVO);
			for (CondicionCompra cond : proveedor.getCondicionesCompra()) {
				cond.setProveedor(proveedor);
			}
			persist(proveedor);
		}catch(Exception e){
			logger.log(Level.SEVERE, e.getMessage());
		}
	}

	@Override
	public Proveedor merge(Proveedor entity) {
		return proveedorDAO.merge(entity);
	}
	
	public void actualizar(ProveedorVO proveedorVO) {
		try{
			Proveedor proveedor = findByID(proveedorVO.getIdProveedor());
			proveedor.setVO(proveedorVO);
			for (CondicionCompraVO condicionCompraVO : proveedorVO.getCondicionesCompra()) {
				if (condicionCompraVO.getId() == null){
					CondicionCompra condicionCompra = new CondicionCompra();
					condicionCompra.setVO(condicionCompraVO);
					proveedor.getCondicionesCompra().add(condicionCompra);	
				}else{
					for (CondicionCompra condicionCompra: proveedor.getCondicionesCompra()) {
						if (condicionCompra.getId() == condicionCompraVO.getId()){
							condicionCompra.setVO(condicionCompraVO);
						}
					}
				}
			}			
			merge(proveedor);
		}catch(Exception e){
			logger.log(Level.SEVERE, e.getMessage());
		}
	}

	@Override
	public Proveedor findByRazonSocial(String razonSocial) {
		return proveedorDAO.findByRazonSocial(razonSocial);
	}

	@Override
	public Proveedor findByListaPreciosID(Integer listaPreciosID) {
		List<ListaPrecios> listasPrecios = listaPreciosService.getListasPrecios();
		for(ListaPrecios listaPrecios : listasPrecios){
			if(listaPrecios.getId().equals(listaPreciosID)){
				return listaPrecios.getProveedor();
			}
		}
		return null;
	}

	@Override
	public Boolean existeProveedor(Proveedor proveedor) {
		Proveedor proveedorEncontrado = null;
		proveedorEncontrado = this.findByRazonSocial(proveedor.getRazonSocial());
		if(proveedorEncontrado == null){
			return false;
		}else{
			return true;
		}
	}

}
